#define _USE_MATH_DEFINES

#include <cstdio>
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <cassert>
#include <stack>
#include <cstdlib>
#include <bitset>
#include <cmath>

#define forn(i,n) for (int i = 0; i < int(n); ++i)
#define pb push_back
#define all(a) a.begin(),a.end()
#define sz(a) int(a.size())
#define mp make_pair

using namespace std;

typedef long long li;
typedef long double ld;

typedef pair<int,int> pt;
#define ft first
#define sc second

const int INF = int(1e9);
const li INF64 = li(1e18);
const ld EPS = 1e-9;

//#define TASK_NAME ""

int n, m, q;

bool read() {
	if (scanf("%d%d%d\n", &n, &m, &q) != 3)
		return false;

	if (n == 0 && m == 0 && q == 0)
		return false;

	return true;
}

const int N = 1000;
	
char buf1[N], buf2[N];

int ans[N];
char prevSw[N], prevB[N];

void out(int x)
{
	if (x <= 9)
		printf("%d", x);
	else
	{
		x -= 10;
		printf("%c", char(x + 'A'));
	}
}

void solve() {
	forn (i, m)
		ans[i] = (1LL << n) - 1;

	forn (i, N)
		prevSw[i] = prevB[i] = '0';

	forn (_, q)
	{

		scanf("%s %s\n", buf1, buf2);

		li ch = 0, nch = 0;

		forn (i, n)
		{
			if (buf1[i] == '1')
				ch ^= 1LL << i;
			else
				nch ^= 1LL << i;
			prevSw[i] = buf1[i];
		}

		forn (i, m)
		{
			if (prevB[i] != buf2[i])
				ans[i] &= ch;
			else
				ans[i] &= nch;
			prevB[i] = buf2[i];
		}
	}

	forn (i, m)
		if ((ans[i] & (ans[i] - 1)) == 0)
		{
			forn (j, n)
				if (ans[i] & (1 << j))
					out(j);
		}
		else
			printf("?");
	
	puts("");
}

int main() {
#ifdef TASK_NAME
	freopen(TASK_NAME ".in", "r", stdin);
	freopen(TASK_NAME ".out", "w", stdout);
#endif

#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	while (read())
		solve();

	return 0;
}